package com.ruoyi.fault.service.impl;

import java.util.List;
import com.ruoyi.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import com.ruoyi.common.utils.StringUtils;
import org.springframework.transaction.annotation.Transactional;
import com.ruoyi.fault.domain.FaultAssign;
import com.ruoyi.fault.mapper.FaultRepairMapper;
import com.ruoyi.fault.domain.FaultRepair;
import com.ruoyi.fault.service.IFaultRepairService;

/**
 * 故障处理Service业务层处理
 *
 * @author silence
 * @date 2025-07-21
 */
@Service
public class FaultRepairServiceImpl implements IFaultRepairService
{
    @Autowired
    private FaultRepairMapper faultRepairMapper;

    /**
     * 查询故障处理
     *
     * @param id 故障处理主键
     * @return 故障处理
     */
    @Override
    public FaultRepair selectFaultRepairById(Long id)
    {
        return faultRepairMapper.selectFaultRepairById(id);
    }

    /**
     * 查询故障处理列表
     *
     * @param faultRepair 故障处理
     * @return 故障处理
     */
    @Override
    public List<FaultRepair> selectFaultRepairList(FaultRepair faultRepair)
    {
        return faultRepairMapper.selectFaultRepairList(faultRepair);
    }

    /**
     * 新增故障处理
     *
     * @param faultRepair 故障处理
     * @return 结果
     */
    @Transactional
    @Override
    public int insertFaultRepair(FaultRepair faultRepair)
    {
        faultRepair.setCreateTime(DateUtils.getNowDate());
        int rows = faultRepairMapper.insertFaultRepair(faultRepair);
        // FaultRepair插入成功后，其ID会自动回写到faultRepair对象中
        insertFaultAssign(faultRepair);
        return rows;
    }

    /**
     * 修改故障处理
     *
     * @param faultRepair 故障处理
     * @return 结果
     */
    @Transactional
    @Override
    public int updateFaultRepair(FaultRepair faultRepair)
    {
        faultRepair.setUpdateTime(DateUtils.getNowDate());
        // !!!修改!!! 在更新父记录前，先删除关联的子记录。
        // 这里传入的是 fault_repair 的 ID (即 fault_assign 的 repair_id)
        faultRepairMapper.deleteFaultAssignByRepairId(faultRepair.getId());
        insertFaultAssign(faultRepair); // 重新插入新的关联记录
        return faultRepairMapper.updateFaultRepair(faultRepair);
    }

    /**
     * 批量删除故障处理
     *
     * @param ids 需要删除的故障处理主键 (这些是 fault_repair 的 ID, 也就是 fault_assign 的 repair_id )
     * @return 结果
     */
    @Transactional
    @Override
    public int deleteFaultRepairByIds(Long[] ids)
    {
        // !!!修改!!! 在删除父记录前，先批量删除关联的子记录。
        // 传入的是 fault_repair 的 ID 数组 (即 fault_assign 的 repair_id 数组)
        faultRepairMapper.deleteFaultAssignByRepairIds(ids);
        return faultRepairMapper.deleteFaultRepairByIds(ids);
    }

    /**
     * 删除故障处理信息
     *
     * @param id 故障处理主键 (这个是 fault_repair 的 ID, 也就是 fault_assign 的 repair_id)
     * @return 结果
     */
    @Transactional
    @Override
    public int deleteFaultRepairById(Long id)
    {
        // !!!修改!!! 在删除父记录前，先删除关联的子记录。
        // 传入的是 fault_repair 的 ID (即 fault_assign 的 repair_id)
        faultRepairMapper.deleteFaultAssignByRepairId(id);
        return faultRepairMapper.deleteFaultRepairById(id);
    }

    /**
     * 新增维修人员分配信息
     *
     * @param faultRepair 故障处理对象
     */
    public void insertFaultAssign(FaultRepair faultRepair)
    {
        List<FaultAssign> faultAssignList = faultRepair.getFaultAssignList();
        // 确保 faultRepair 的 ID 已经通过 useGeneratedKeys 回写
        Long repairId = faultRepair.getId();
        if (StringUtils.isNotNull(faultAssignList))
        {
            List<FaultAssign> list = new ArrayList<FaultAssign>();
            for (FaultAssign faultAssign : faultAssignList)
            {
                // 设置 fault_assign 的 repairId 为其父对象 fault_repair 的 ID
                faultAssign.setRepairId(repairId);
                list.add(faultAssign);
            }
            if (list.size() > 0)
            {
                faultRepairMapper.batchFaultAssign(list);
            }
        }
    }
}
